import { login, getInfo } from '@/api/user'
import { getToken, setToken, removeToken } from '@/utils/auth'
import router from '@/router'

// 导入路由规则
import { asyncRoutes, constantRoutes, resetRouter } from '@/router'

const getDefaultState = () => {
  // 声明一个对象{}的语法等价于：new Object()
  return {
    token: getToken(),
    userInfo: {},
    routes: constantRoutes // 所有的路由规则用来生成左侧菜单
  }
}

// 装数据的
const state = getDefaultState()

// 同步
const mutations = {
  // mutations 里的第一个参数是state
  RESET_STATE: (state) => {
    // console.log(22222)
    removeToken()
    // 目的：初始化state数据（即：把state里的值全部置空）
    Object.assign(state, getDefaultState())
    console.log(router)
    resetRouter()
    // 为什么不这样写？？？？？
    // state = getDefaultState()
  },
  SET_TOKEN: (state, token) => {
    state.token = token
  },
  SET_USER_INFO: (state, val) => {
    state.userInfo = val
  },
  Add_Routes: (state, val) => {
    state.routes = [...state.routes, ...val]
  }
}

// 异步
const actions = {
  // user login
  // actions里第一个参数是store，不是state
  login: function({ commit }, userInfo) {
    const { mobile, password } = userInfo
    return new Promise((resolve, reject) => {
      // trim() 去掉字符串两边的空格
      login({ mobile: mobile, password: password }).then(response => {
        const { data } = response
        // 把token保存到vuex中的state里
        commit('SET_TOKEN', data)
        // 把token保存到cookie（即硬盘）
        setToken(data)
        resolve()
      }).catch(error => {
        reject(error)
      })
    })
  },

  // get user info
  getInfo({ commit, state }) {
    return new Promise((resolve, reject) => {
      getInfo(state.token).then(async response => {
        const { data } = response
        // console.log(1)
        // 把用户信息保存到vuex中
        commit('SET_USER_INFO', data)
        const name = data.roles.menus
        // console.log(name)
        // console.log(asyncRoutes)
        const arr = asyncRoutes.filter(item => name.includes(item.name))
        // console.log(arr)
        arr.push({ path: '*', redirect: '/404', hidden: true })
        // 直接添加肯定不行
        // constantRoutes.push(...arr)
        router.addRoutes(arr)
        // 通过addRoutes动态添加的路由规则不能刷新、而且在路由规则里面找不到（this.router）

        commit('Add_Routes', arr)
        // console.log(arr)

        resolve()
      }).catch(error => {
        reject(error)
      })
    })
  },

  // user logout
  logout({ commit, state }) {

  },

  // remove token
  resetToken({ commit }) {

  }
}

export default {
  // 开启命名空间
  namespaced: true,
  state,
  mutations,
  actions
}
